package 动态代理.介绍_准备工作_创建_工作流程演示;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {
    public static Star createProxy(BigStar bigStar){
        /*
        newProxyInstance(ClassLoader loader,
                Class<?>[] interfaces,
                InvocationHandler h)
                参数1: 用于指定一个类加载器, (这基本上是固定格式, 拿着当前类操作, 即: 当前类.class.getClassLoader())
                参数2: 指定生成的代理长什么样子, 也就是有那些方法
                参数3: 用来指定生成的代理对象要干什么事情
                */
        Star starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {
            @Override // 回调方法
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 代理对象要做的事情, 会在这里写代码
                if (method.getName().equals("sing")) {
                    System.out.println("准备话筒, 收钱二十万");
                } else if (method.getName().equals("dance")) {
                    System.out.println("准备场地, 收钱一千万");
                }
                return method.invoke(bigStar, args);
            }
        }); //Java提供的代理对象
        return starProxy;
    }
}
